﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.CompilerServices;
using System.Collections.ObjectModel;

[assembly: InternalsVisibleTo("Stationierung.Test")]
namespace Stationierung.Model
{
    public class GesamtFläche
    {

        public GesamtFläche()
        {
            Stationen = new ObservableCollection<Station>();
        }
        private Dictionary<double, double> StationenRaster = new Dictionary<double, double>();
        public void AddStation(double Station, double Breite)
        {
            if (Station >= 0 && Breite >= 0 && !StationenRaster.ContainsKey(Station))
            {
                StationenRaster.Add(Station, Breite);
                Stationen.Add(new Station { StationsNummer = Station, Breite = Breite });
            }
            else
            {

            }
            Stationen =  new ObservableCollection<Model.Station>(Stationen.OrderBy(s => s.StationsNummer));
        }
        public bool CanAddStation(double Station, double Breite)
        {
            bool retVal = false;
            if (Station >= 0 && Breite >= 0 && !StationenRaster.ContainsKey(Station))
            {
                retVal = true;
            }
            return retVal;
        }
        public void ResetStations()
        {
            Stationen.Clear();
            StationenRaster.Clear();
        }

        public void DelStation(double Station)
        {
            if (StationenRaster.ContainsKey(Station))
            {
                Station stationToRemove = null;
                foreach (var _station in Stationen)
                {
                    if (_station.StationsNummer == Station)
                    {
                        stationToRemove = _station;
                        break;
                    }
                }
                if(stationToRemove!=null)Stationen.Remove(stationToRemove);
                StationenRaster.Remove(Station);
            }
        }
        public ObservableCollection<Station> Stationen { get; private set; }
        private double berechneFlächeninhalt()
        {
            double flächeninhalt = 0;
            if (!StationenRaster.ContainsKey(0))
            {
                flächeninhalt = -1;
            }
            else
            {
                if (StationenRaster.Count > 1)
                {
                    var stationen = generateStationen();
                    foreach (var fläche in stationen)
                    {
                        flächeninhalt += fläche.Flächeninhalt;
                    }
                }
            }
            return flächeninhalt;
        }

        private List<Fläche> generateStationen()
        {
            List<Fläche> retVal = null;
            if (StationenRaster.Count > 1)
            {
                retVal = new List<Fläche>();
                var sortedRaster = (from s in StationenRaster orderby s.Key ascending select s).ToList();

                double breiteAnfang = sortedRaster[0].Value;
                double breiteEnde = 0;
                double länge =0;
                for (int i = 0; i < StationenRaster.Count-1; i++)
                {
                    länge = sortedRaster[i + 1].Key - sortedRaster[i].Key;
                    breiteEnde = sortedRaster[i + 1].Value;
                    
                    retVal.Add(new Fläche { BreiteAnfang = breiteAnfang, BreiteEnde = breiteEnde, Länge = länge });
                    breiteAnfang = breiteEnde;
                }
            }
            return retVal;
        }
        public string Flächeninhalt 
        { 
            get 
            {
                string retVal;
                double flächenInhalt = berechneFlächeninhalt();
                if (flächenInhalt != -1)
                {
                    retVal = flächenInhalt.ToString();
                }
                else
                {
                    retVal = "Es fehlt die 0,0-Station";
                }
                return retVal;
            } 
        }
    }
}
